現代線上服務或應用程式幾乎都需要做身分驗證,因為在知道使用者是誰的前提下,才有辦法針對使用者收費,並提供更好的付費服務。當服務做得越來越大,而其他家的產品對使用者的資料有興趣想串接時,這時就會需要一個安全的身分驗證與授權機制來達成這個目標。
OAuth 2.0 與 OpenID Connect 是目前 Web 平台上主流的身分驗證與授權的協定。包括 Google 與 Microsoft Office 365 兩個大廠都支援 OpenID Connect 協定;其他如 LINE Login 也是採用 OpenID Connect 協定,Facebook 的文件也有 OpenID Connect 協定相關的內容。
OpenID Connect 必然是經過一定程度的考驗,這些領導技術的大廠才會都採用 OpenID Connect 協定,因此我們也可以相信它的可靠度。OpenID Foundation 也有得到非常多企業的贊助與支援,這表示大多數企業也都認同他們所產出的規範,包括 OpenID Connect 協定。
現在回頭來看看自己的產品,當我們產品開始起步成長後,需求越多,系統互相串接的複雜度也會隨之提升;另一方面,使用者量成長,想破解網站的駭客也就越多。這時就可以來考慮採用 OpenID Connect 協定,來提高身分驗證與授權的安全性了。
本系列將會介紹如何使用以及導入九頭蛇--Hydra 到手上的既有系統中,讓系統可以開始支援 OpenID Connect 協定。
Hydra 的全名為 ORY Hydra,是一間名為 ORY 的德國公司發布的開源套裝軟體。
一言以蔽之:Hydra 的目標是實作 OAuth 2.0 授權伺服器(Authorization Server),同時也是 OpenID Connect 服務提供者(OpenID Provider)。
以下介紹 Hydra 的幾個特色。
這是 Hydra 很吸引人的特色。
Hydra 系統本身不存放使用者相關資料,如帳號密碼資訊等。它只負責控制 OpenID Connect 協定流程以及保留身分驗證和授權的記錄。這代表,使用 Hydra 不需要使用者資料庫遷移的過程,而是將 Hydra 作為一個服務串接即可。
這也正是 Hydra 設計厲害的地方--要如何存取使用者資料庫以及驗證使用者,是完全自由,可以客製化的,包括流程、實作的程式語言、或是透過其他第三方登入機制等。唯一的限制只有一個--與 OpenID Connect 協定相同,需要透過 HTTP 協定溝通。
Hydra 使用 Golang 撰寫,功能專注於完成 OpenID Connect 協定的流程以及身分驗證和授權記錄,執行效能與記憶體使用量表現都非常好的。
Hydra 以一個可執行檔來發布,它除了可以啟動主要服務以外,也可以做為後台管理程序執行,這對開發者是非常友善的。主要服務與指令程式,透過 Golang 打包成單一執行檔,可以各個主流平台上執行,如 Mac、Windows 等,當然也包括 Docker,這對維運人員也是非常友善的。
Hydra 軟體架構設計符合 The Twelve-Factor App 所提到的要素,因此在遷移服務、水平擴展、甚至是直上 K8S 都是容易的。
實作能夠掌控存取行為的授權伺服器或是 OpenID Connect 服務提供者時,資安考量是非常重要的。Hydra 在設計的時候,預設已有考慮過嚴謹的安全性。
Hydra 的安全架構有依據 RFC 6819 - OAuth 2.0 Threat Model and Security Consideration,也就是針對 OAuth 2.0 協定各種可能的風險提出其他安全注意事項,來做更嚴密的防護,如:OpenID Connect Core 1.0 - 3.1.2.1. Authentication Request 裡提到 state 參數,定義是 RECOMMENDED
。但 RFC 6819 裡面有提到可以應用 state 來提高安全性,因此Hydra 設計是 REQUIRED
,如果沒有帶 state 參數的話會拒絕請求。
最後,Hydra 通過了 OpenID 官方認證,因此協定的相容性是可以信任的。有通過認證是非常重要的參考依據,這表示串接服務遇到的問題會相較少很多。比方說,筆者使用了一樣是 OpenID 官方認證的 openid-client 套件,串接過程都非常順利,照著套件說明書一步步填上必要的參數,程式執行後即可完成串接。
順帶一提的是,通過官方認證的列表裡,可以看到有幾家知名大廠,如 Google、Microsoft 還有 LINE Login,包括筆者接觸過的另一套 WSO2 Identity Server 也在裡面。而 AppleID 雖然也有做出類似 OpenID Connect 的流程,但不在列表裡,這是因為 AppleID 實作不符合協定要求,因此就沒有成功完成官方認證了。
本系列文章將會介紹以下內容:
Hydra 原始碼的說明文件有提到,Hydra 實作了 IETF 發布與 OAuth 2.0 相關的標準:
另外也實作了 OpenID Foundation 所提的協定: